package bean.dao;

import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import paquetes.negocioVO.ProveedorVO;
import Entities.CargaViajeLocal;
import Entities.Empleado;
import Entities.Pedido;
import Entities.Sucursal;
import Entities.Vehiculo;
import Entities.Viaje;
import Entities.ViajeCarrier;
import Entities.ViajeInterSucursal;
import Entities.ViajeLocal;

public class ViajeDAO {

		
		private static ViajeDAO instancia;
		private static SessionFactory sf;
		
		public static ViajeDAO getInstancia(){
			if(instancia == null){
				sf = (HibernateDAO.getInstancia().getSession().getSessionFactory());
				instancia = new ViajeDAO();
			} 
			return instancia;
		}
		
		@SuppressWarnings("unchecked")
		public Set<Viaje> obtenerViajes(){
			Session s = HibernateDAO.getInstancia().getSession();
			Transaction t = s.beginTransaction();
			Set<Viaje> lista = (Set<Viaje>) s.createQuery("from Viajes").list();		
			t.commit();
			return lista;
		}
		
		public void guardarViaje(Viaje v){
			Session s = HibernateDAO.getInstancia().getSession();
			Transaction t = s.beginTransaction();
			s.save(v);		
			t.commit();	
		}
		
		public void programarInterSucursal(int sucOrig, Date fecha, int sucDest,
				int idVeh, int[] pedidos, int idEmp)
		{
			Session s = HibernateDAO.getInstancia().getSession();
			Transaction t = s.beginTransaction();
			
			Sucursal origen = SucursalDAO.getInstancia().getSucursal(sucOrig);
			Sucursal destino = SucursalDAO.getInstancia().getSucursal(sucDest);
			
			Set<Pedido> p = getSetPedidos(pedidos, s);
			
			Empleado empleado = EmpleadoDAO.getInstancia().getEmpleado(idEmp);
			Vehiculo vehiculo = VehiculoDAO.getInstancia().get(idVeh);
			
			ViajeInterSucursal viaje = new ViajeInterSucursal();
			viaje.setCarga(p);
			viaje.setFechaLlegadaEfectiva(null);
			viaje.setFechaLlegadaEstimada(null);
			viaje.setFechaSalidaEfectiva(null);
			viaje.setFechaSalidaRequerida(null);
			viaje.setOrigen(origen);
			viaje.setVehiculo(vehiculo);
			viaje.setRuta(null);//TODO: HojaDeRutaDAO.getInstancia().get(origen, destino));
			
			s.save(viaje);
					
			t.commit();
		}
		
		public void programarEntregaEnDomicilio(int suc, Date fecha, String ruta, int tiempo, int km, int idVeh, int[] cargas, int idEmp)
		{
			
			Session s = HibernateDAO.getInstancia().getSession();
			Transaction t = s.beginTransaction();
			
			Set<CargaViajeLocal> p = getSetCargas(cargas, s);
			
			Empleado empleado = EmpleadoDAO.getInstancia().getEmpleado(idEmp);
			Vehiculo vehiculo = VehiculoDAO.getInstancia().get(idVeh);
			
			ViajeLocal viaje = new ViajeLocal();
			viaje.setCargaLocal(p);
			viaje.setFechaLlegadaEfectiva(null);
			viaje.setFechaLlegadaEstimada(null);
			viaje.setFechaSalidaEfectiva(null);
			viaje.setFechaSalidaRequerida(null);
			viaje.setVehiculo(vehiculo);
			viaje.setDistanciaEstimadaKm(km);
			
			s.save(viaje);
					
			t.commit();
		}
		
		private void programarEntregaCarrier(int suc, Date fecha, String ruta,
				int tiempo, int km, int idVeh, int[] pedidos, int idEmp,
				ProveedorVO pc)
		{
			Session s = HibernateDAO.getInstancia().getSession();
			Transaction t = s.beginTransaction();
			
			Sucursal origen = SucursalDAO.getInstancia().getSucursal(suc);
			
			Set<Pedido> p = getSetPedidos(pedidos, s);
			
			Empleado empleado = EmpleadoDAO.getInstancia().getEmpleado(idEmp);
			Vehiculo vehiculo = VehiculoDAO.getInstancia().get(idVeh);
			
			ViajeCarrier viaje = new ViajeCarrier();
			viaje.setCarga(p);
			viaje.setFechaLlegadaEfectiva(null);
			viaje.setFechaLlegadaEstimada(null);
			viaje.setFechaSalidaEfectiva(null);
			viaje.setFechaSalidaRequerida(null);
			viaje.setOrigen(origen);
			viaje.setVehiculo(vehiculo);
			viaje.setCarrier(ProveedorDAO.getInstancia().getCarrier(pc.getId()));
			
			s.save(viaje);
					
			t.commit();
		}

		@SuppressWarnings("unchecked")
		private Set<Pedido> getSetPedidos(int[] pedidos, Session s) {
			Collection<Pedido> pedid = s.createQuery("from Pedido where id IN(:pedidos)")
					.setParameterList("pedidos", Arrays.asList(pedidos))
					.list();
			
			Set<Pedido> p = new HashSet<Pedido>();
			p.addAll(pedid);
			
			return p;
		}
		
		@SuppressWarnings("unchecked")
		private Set<CargaViajeLocal> getSetCargas(int[] cargas, Session s) {
			Collection<CargaViajeLocal> pedid = s.createQuery("from CargaViajeLocal where id IN(:cargas)")
					.setParameterList("cargas", Arrays.asList(cargas))
					.list();
			
			Set<CargaViajeLocal> p = new HashSet<CargaViajeLocal>();
			p.addAll(pedid);
			
			return p;
		}

		public List<Viaje> getViajes() {
			// TODO Auto-generated method stub
			return null;
		}

		public Viaje getViaje(int id) {
			// TODO Auto-generated method stub
			return null;
		}

		public void bajaViaje(int id) {
			// TODO Auto-generated method stub
			
		}
		
		public static void setSf(SessionFactory sf) {
			ViajeDAO.sf = sf;
		}

		public static SessionFactory getSf() {
			return sf;
		}

		


}
